package albero;

import asd.TestObject;
import asd.graphics.GObject;
import asd.graphics.GStyle;
import java.awt.Color;
import java.util.Iterator;

/**
 *
 * @author Giovanni Cammarata
 */
public class ASDUtil {

    public ASDUtil() {
    }
    
    
    
//    /**
//     * Il metodo permette di disegnare graficamente l'albero,
//     * ovvero la rappresentazione dell'albero sintattico decorato.
//     * @param tree Struttura dati albero.
//     * @param root radice dell'albero alal quale aggiunge i nodi.
//     */
//    public void disegnaAlbero(NodoASD rootASD,GObject root) {
//        disegnaAlbero(rootASD, 0, root,650,255,255,255);
//    }
//    
//    private void disegnaAlbero(NodoASD v, int level,GObject root, int x,int rgb1,int rgb2,int rgb3) {
//        if (v == null) return;
//        
//        int numerofigli=v.getFigli().size();
//        
//        GObject child = new TestObject (v.getVal(), root, x, 50.0+180*level);
//        GStyle style = new GStyle();
//        style.setBackgroundColor (new Color (rgb1, rgb2, rgb3));
//        child.setStyle(style);
//        //System.out.println(v.getElement().toString() +" POSIZIONE"+x);
//        child.setParent_(root);
//        
//        if(v.getFigli().size()>0) {
//            double larghezza = 900/numerofigli;
//            int i=1;
//            Iterator it = v.getFigli().iterator();
//            int rand1 = (int)(Math.random() * 255);
//            int rand2 = (int)(Math.random() * 255);
//            int rand3 = (int)(Math.random() * 255);
//            while(it.hasNext()) {
//                NodoASD children = (NodoASD) it.next();
//                disegnaAlbero(children, level + 1,child,(int)((larghezza-70*level)*i),rand1,rand2,rand3);
//                i++;
//            }
//        }
//        
//    }
    
    public void stampaNodi(NodoASD root) {
        stampaNodi(root, 0);
    }

    private void stampaNodi(NodoASD v, int level) {
        if (v == null) return;
        for (int i = 0; i < level - 1; i++) {
            System.out.print("   ");
        }
        if (level > 0)
            System.out.print(" |--  ");
        if(v.getNome()!=null)
            System.out.println(v.getNome()+": "+v.getVal());
        else
            System.out.println(v.getVal());
        for (NodoASD children : v.getFigli()) {
            stampaNodi(children, level + 1);
        }
    }
    
    
    /**
     * Il metodo permette di disegnare graficamente l'albero,
     * ovvero la rappresentazione dell'albero sintattico decorato.
     * @param tree Struttura dati albero.
     * @param root radice dell'albero alla quale aggiunge i nodi.
     */
    public void disegnaAlbero(NodoASD rootASD,GObject root) {
        disegnaAlbero(rootASD, 0, root,600,255,255,255,0,0,true,0,0);
    }
    
    private void disegnaAlbero(NodoASD v, int level,GObject root, int x,int rgb1,int rgb2,int rgb3,int indexFiglio,int indexPadre,boolean first,int posizionePadre,int numeroFigli) {
        if (v == null) return;
        
        int numerofigli=v.getFigli().size();
        System.out.println("FIGLI "+v.getVal()+" "+numerofigli+" Livello: "+level+" IndexF: "+indexFiglio+" IndexP: "+indexPadre+ "  x: "+x);
        
        GObject child;
        if(level==0)
            x=600;
        else if(numeroFigli==1) {
              x = posizionePadre;
        }
        else{
                //x = (int)(x+(150*(indexPadre+indexFiglio-1)) - level*indexFiglio*15);
                //x = (int)(1200/x+(250*(indexPadre+indexFiglio-1)));
                  int z = (indexPadre) * 105;
                  //z = 0;
                  x = (int)(x+(150*(indexPadre+indexFiglio-1))-z);
               
            }
        
        String contenuto;
        if (v.getNome()!=null)
            contenuto = v.getNome()+": "+v.getVal();
        else
            contenuto = v.getVal();
        
        //x = 900-x-indexFiglio*50;
        child = new TestObject (contenuto, root, x, 70.0+200*level);
        GStyle style = new GStyle();
        style.setBackgroundColor (new Color (rgb1, rgb2, rgb3));
        child.setStyle(style);
        //System.out.println(v.getElement().toString() +" POSIZIONE"+x);
        child.setParent_(root);
        
        int indexFiglioNew=0;
        if(v.getFigli().size()>0) {
            int i=1;
            Iterator it = v.getFigli().iterator();
            int rand1 = (int)(Math.random() * 255);
            int rand2 = (int)(Math.random() * 255);
            int rand3 = (int)(Math.random() * 255);
            while(it.hasNext()) {
                NodoASD children = (NodoASD) it.next();
                
                disegnaAlbero(children, level + 1,child,(int)(x),rand1,rand2,rand3,indexFiglioNew,indexFiglio,false,x,v.getFigli().size());
                i++;
                indexFiglioNew++;
            }
        }
        
    }
}
